package com.miyu.magicapi.config;

import com.miyu.magicapi.vo.CustomPage;
import org.springframework.stereotype.Component;
import org.ssssssss.magicapi.core.context.RequestEntity;
import org.ssssssss.magicapi.core.interceptor.ResultProvider;
import org.ssssssss.magicapi.modules.db.model.Page;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Component
public class CustomJsonValueProvider implements ResultProvider {
    /**
     * 根据异常内容构建结果
     *
     * @param requestEntity 请求信息
     * @param root          异常对象
     */
    @Override
    public Object buildResult(RequestEntity requestEntity, Throwable root) {
        return ResultProvider.super.buildResult(requestEntity, root);
    }

    /**
     * 构建JSON返回结果，code和message 默认为 1 success
     *
     * @param requestEntity 请求相关信息
     * @param data          返回内容
     */
    @Override
    public Object buildResult(RequestEntity requestEntity, Object data) {
        return ResultProvider.super.buildResult(requestEntity, data);
    }

    /**
     * 构建JSON返回结果
     *
     * @param requestEntity 请求相关信息
     * @param code          状态码
     * @param message       状态说明
     */
    @Override
    public Object buildResult(RequestEntity requestEntity, int code, String message) {
        return ResultProvider.super.buildResult(requestEntity, code, message);
    }

    /**
     * 构建异常返回结果
     *
     * @param requestEntity 请求相关信息
     * @param throwable     异常信息
     * @since 1.2.2
     */
    @Override
    public Object buildException(RequestEntity requestEntity, Throwable throwable) {
        return ResultProvider.super.buildException(requestEntity, throwable);
    }

    /**
     * 构建JSON返回结果
     *
     * @param requestEntity 请求相关信息
     * @param code          状态码
     * @param message       状态说明
     * @param data          数据内容，可以通过data的类型判断是否是分页结果进行区分普通结果集和分页结果集
     */
    @Override
    public Object buildResult(RequestEntity requestEntity, int code, String message, Object data) {
        // 如果对分页格式有要求的话，可以对data的类型进行判断，进而返回不同的格式
        return new HashMap<String,Object>(){
            {
                put("code", code);
                put("msg", message);
                put("data", data);
            }
        };
    }

    /**
     * @param requestEntity 请求相关信息
     * @param page          分页对象
     * @param total         总数
     * @param data          数据内容
     */
    @Override
    public Object buildPageResult(RequestEntity requestEntity, Page page, long total, List<Map<String, Object>> data) {
        CustomPage p = new CustomPage();
        p.setTotalElements(total);
        p.setSize(page.getLimit());
        p.setNumber(page.getLimit()==0?0:page.getOffset()/ page.getLimit());
        p.setTotalPages(page.getLimit()==0?1:total/ page.getLimit()+1);
         return new HashMap<String,Object>(){
            {
                put("page", p);
                put("content", data);
            }
        };
    }
}
